package {
	
	import br.com.damazzy.manterVenda.VendaSelecaoView;
	import br.com.damazzy.util.StringUtils;
	import br.com.damazzy.util.TratamentoErros;
	import br.com.damazzy.vo.ProdutoVO;
	import br.com.damazzy.vo.VendaVO;
	
	import flash.events.Event;
	import flash.events.KeyboardEvent;
	import flash.events.MouseEvent;
	
	import mx.collections.ArrayCollection;
	import mx.controls.Alert;
	import mx.core.Application;
	import mx.events.CloseEvent;
	import mx.events.FlexEvent;
	import mx.events.ListEvent;
	import mx.managers.PopUpManager;
	import mx.rpc.events.FaultEvent;
	import mx.rpc.events.ResultEvent;
	
	public class VendaSelecao extends VendaSelecaoView {
		
		private static const TIPO_VENDA_DINHEIRO: String = "DINHEIRO";
		private static const TIPO_VENDA_CARTAO_DEBITO_VISA: String = "CARTÃO DE DÉBITO VISA";
		private static const TIPO_VENDA_CARTAO_DEBITO_MASTERCARD: String = "CARTÃO DE DÉBITO MASTERCARD";
		private static const TIPO_VENDA_CARTAO_DEBITO_AMERICAN_EXPRESS: String = "CARTÃO DE DÉBITO AMERICAN EXPRESS";
		private static const TIPO_VENDA_CARTAO_DEBITO_HIPERCARD: String = "CARTÃO DE DÉBITO HIPERCARD";
		
		[Bindable]
		private var _listaProdutos: ArrayCollection;
		private var listaTiposPagamento: ArrayCollection;
		private var listaQtdParcelas: ArrayCollection;
		private var telaDamazzy: Damazzy = Application.application as Damazzy;
		private var _telaAplicacao: Aplicacao;
		private var valorTotal: Number = 0;
		private var valorTotalDesconto: Number = 0;
		
		public function VendaSelecao() {
			super();
			
			this.addEventListener(FlexEvent.CREATION_COMPLETE, init);
			
			include 'br/com/damazzy/util/RegistroVOs.as';
		}
		
		private function init(event: FlexEvent): void {
			
			btnAdicionarProduto.addEventListener(MouseEvent.CLICK, adicionarProduto);
			btnAdicionarProduto.addEventListener(KeyboardEvent.KEY_DOWN, enterPressionadoCodProduto);
			btnPesquisarProduto.addEventListener(MouseEvent.CLICK, pesquisarProduto);
			btnRemoverProduto.addEventListener(MouseEvent.CLICK, alertaRemoverProduto);
			btnLimparProdutos.addEventListener(MouseEvent.CLICK, clickLimparProdutosDataGrid);
			btnCalcularDesconto.addEventListener(MouseEvent.CLICK, calcularValorTotalCompra);
			btnCalcularDesconto.addEventListener(KeyboardEvent.KEY_DOWN, enterPressionadoDesconto);
			btnRealizarVenda.addEventListener(MouseEvent.CLICK, realizarVenda);
			btnCancelarVenda.addEventListener(MouseEvent.CLICK, limparDados);
			btnFechar.addEventListener(MouseEvent.CLICK, _telaAplicacao.carregarTelaPrincipal);
			cbxTipoPagamento.addEventListener(ListEvent.CHANGE, tipoPagamentoSelecionado);
			
			rm.obterDefinicoesSelecao.addEventListener(ResultEvent.RESULT, resultObterDefinicoesSelecao);
			rm.obterDefinicoesSelecao.addEventListener(FaultEvent.FAULT, TratamentoErros.fault);
			rm.realizarVenda.addEventListener(ResultEvent.RESULT, resultRealizarVenda);
			rm.realizarVenda.addEventListener(FaultEvent.FAULT, TratamentoErros.fault);
			rm.obterProduto.addEventListener(ResultEvent.RESULT, resultAdicionarProduto);
			rm.obterProduto.addEventListener(FaultEvent.FAULT, TratamentoErros.fault);
			
			rm.obterDefinicoesSelecao();
			
			txtVendedor.text = telaDamazzy.autenticacao.vo.nomePessoa;
			txtCodProduto.addEventListener(KeyboardEvent.KEY_DOWN, enterPressionadoCodProduto);
			txtDesconto.addEventListener(KeyboardEvent.KEY_DOWN, enterPressionadoDesconto);
			
			limparDados();
		}
		
		private function resultObterDefinicoesSelecao(event: ResultEvent): void {
			listaTiposPagamento = event.result.dados.listaTiposPagamento;
			
			/* Cria o objeto vazio */
			var voVazia: VendaVO = new VendaVO();
			voVazia.descTipoPagamento = "---";
			listaTiposPagamento.addItemAt(voVazia, 0);
			
			cbxTipoPagamento.dataProvider = listaTiposPagamento;
			
			criarComboQtdParcelas();
		}
		
		private function criarComboQtdParcelas(): void {
			listaQtdParcelas = new ArrayCollection();
			
			var objQtdParcela: VendaVO = new VendaVO();
			
			/* Cria o objeto vazio */
			objQtdParcela.qtdParcelas = null;
			objQtdParcela.descQtdParcelas = "---";
			listaQtdParcelas.addItem(objQtdParcela);
			
			/* Cria 6 objetos */
			for (var i: int = 1; i <= 6; i++) {
				
				objQtdParcela = new VendaVO();
				
				objQtdParcela.qtdParcelas = i.toString();
				objQtdParcela.descQtdParcelas = i.toString() + " x";
				listaQtdParcelas.addItem(objQtdParcela);
			}
			
			cbxQtdParcelas.dataProvider = listaQtdParcelas;
		}
		
		private function adicionarProduto(event: Event = null): void {
			
			var voFiltro: VendaVO = new VendaVO();
			
			if (txtCodProduto.text != "") {
				
				var codProduto: String = txtCodProduto.text;
				var existeProdutoLista: Boolean = false;
				
				/* Verifica se já não existe o produto com o codigo informado na lista. */
				for each (var vo: VendaVO in _listaProdutos) {
					
					if (vo.codigoProduto.toUpperCase() == codProduto.toUpperCase()) {
						existeProdutoLista = true;
					}
				}
				
				if (!existeProdutoLista) {
					voFiltro.codigoProduto = codProduto;
					rm.obterProduto(voFiltro);
				} else {
					var msg: String = "O produto com este código já consta na lista de compras. Se a compra contempla mais de um mesmo produto, " + 
							"altere a coluna quantidade informando a quantidade comprada do mesmo produto.";
					
					Alert.show(msg, "Erro!");
				}
				
			} else {
				Alert.show("Informe o código do produto.", "Erro!");
			}
		}
		
		private function resultAdicionarProduto(event: ResultEvent): void {
			var vo: VendaVO = event.result.dados.produtoVO;
			
			if (vo != null) {
				
				if (vo.quantidadeEstoque == "0") {
					Alert.show("Não existe disponível em estoque o produto pesquisado.", "Aviso!");
				} else {
					vo.quantidadeProduto = "1";
				
					_listaProdutos.addItem(vo);
					txtCodProduto.text = "";
					txtCodProduto.setFocus();	
				}
				
			} else {
				Alert.show("O produto não foi encontrado pelo código informado.", "Erro!");
			}
		}
		
		private function pesquisarProduto(event: MouseEvent): void {
			_telaAplicacao.abrirCadastroProduto(true, this);
		}
		
		public function resultPesquisarProduto(listaProduto: ArrayCollection): void {
			
			var vo: VendaVO;
			
			for each (var p: ProdutoVO in listaProduto) {
				vo = new VendaVO();
				vo.idProduto = p.idProduto;
				vo.codigoProduto = p.codigo;
				vo.nomeProduto = p.nome;
				vo.valorProduto = p.valor;
				vo.quantidadeProduto = "1";
				vo.quantidadeEstoque = p.quantidadeEstoque;
				
				_listaProdutos.addItem(vo);
			}
		}
		
		private function alertaRemoverProduto(event: MouseEvent): void {
			if (grdProdutos.selectedItem != null) {
				Alert.yesLabel = "Sim";
                Alert.noLabel = "Não";
				Alert.show("Deseja realmente remover o produto selecionado?", "Exclusão", 1|2, this, removerProduto);
			} else {
				if (_listaProdutos.length > 0) {
					Alert.show("Selecione um produto na lista de compras e clique em remover.", "Aviso!");
				} else {
					Alert.show("Não existem produtos para serem removidos.", "Erro!");
				}
			}
		}
		
		private function removerProduto(event: CloseEvent): void {
			if (event.detail == Alert.YES) {
				_listaProdutos.removeItemAt(grdProdutos.selectedIndex);
				
				if (_listaProdutos.length > 0) {
					efetuarCalculoValorTotalCompra(txtDesconto.text);
				} else {
					limparCamposListaComprasVazia();
				}
			}
		}
		
		private function clickLimparProdutosDataGrid(event: MouseEvent): void {
			
			if (_listaProdutos.length > 0) {
				Alert.yesLabel = "Sim";
	            Alert.noLabel = "Não";
				Alert.show("Deseja realmente remover todos os produtos da lista de compras?", "Exclusão", 1|2, this, limparProdutosDataGrid);
			} else {
				Alert.show("Não existem produtos para serem removidos.", "Erro!");
			}
		}
		
		private function limparProdutosDataGrid(event: CloseEvent): void {
			if (event.detail == Alert.YES) {
				_listaProdutos.removeAll();
				limparCamposListaComprasVazia();
			}
		}
				
		public function calcularValorTotalCompra(event: Event = null): void {
			
			if (_listaProdutos.length > 0) {
				
				efetuarCalculoValorTotalCompra(txtDesconto.text);
				
			} else {
				Alert.show("Não existem produtos na lista de compras para calcular o valor da compra.", "Erro!");
			}
		}
		
		private function efetuarCalculoValorTotalCompra(desconto: String = ""): void {
			
			var valorCompra: Number = 0;
			var valorDesconto: Number = 0;
				
			for each (var vo: VendaVO in _listaProdutos) {
				valorCompra += parseFloat(vo.valorProduto) * (vo.quantidadeProduto != "" ? parseInt(vo.quantidadeProduto) : 0);
			}
			
			if (desconto != "") {
				
				lblDesconto.visible = true;
				lblValorDesconto.visible = true;
				
				valorDesconto = (valorCompra * parseFloat(desconto)) / 100;
				lblValorDesconto.text = numberFormatter.format(valorDesconto);
				valorTotalDesconto = valorCompra - valorDesconto;
				valorTotal = valorCompra;
				
			} else {
				valorTotalDesconto = valorCompra;
				valorTotal = valorCompra;
				lblDesconto.visible = false;
				lblValorDesconto.visible = false;
			}
			
			lblValorTotal.text = numberFormatter.format(valorTotalDesconto);
		}
		
		private function realizarVenda(event: MouseEvent): void {
			
			var vo: VendaVO = new VendaVO();
			
			if (validarCampos()) {
				
				if (_listaProdutos.length > 0) {
					
					for each (var tmpVO: VendaVO in _listaProdutos) {
				
						if (tmpVO.quantidadeProduto == "" || tmpVO.quantidadeProduto == "0") {
							Alert.show("Existe um produto que não foi informado a quantidade ou está com o valor zero. " + 
									"Para realizar a venda, informe a quantidade mínima correta ou remova o produto da lista.", "Erro!");
							return;
						}
					}
					
					vo.idPessoaVendedor = telaDamazzy.autenticacao.vo.idPessoa;
					vo.idPessoaComprador = pesquisaPessoas.idPessoa;
					vo.idTipoPagamento = cbxTipoPagamento.selectedItem.idTipoPagamento;
					vo.desconto = txtDesconto.text == "" ? null : txtDesconto.text;
					vo.valorTotal = valorTotal.toString();
					vo.valorTotalDesconto = valorTotalDesconto.toString();
					vo.qtdParcelas = cbxQtdParcelas.selectedIndex != 0 ? cbxQtdParcelas.selectedItem.qtdParcelas : "1";
					vo.listaProdutos = _listaProdutos;
					vo.bolExcluida = "false";
					
					rm.realizarVenda(vo);
					
				} else {
					Alert.show("Não existem produtos adicionados na lista de compras para realizar a venda.", "Erro!");
				}	
			}
		}
		
		private function resultRealizarVenda(event: ResultEvent): void {
			limparDados();
			Alert.show("Venda realizada com sucesso.", "Aviso!");
		}
		
		private function validarCampos(): Boolean {
			
			var msg: String = "O campo ";
			var validacaoOk: Boolean = true;
			
			if (pesquisaPessoas.idPessoa == null) {
				msg += "Cliente";
				validacaoOk = false;
			}else if (cbxTipoPagamento.selectedIndex == 0) {
				msg += "Tipo de Pagamento";
				validacaoOk = false;
			} else if (cbxQtdParcelas.selectedIndex == 0 && !tipoPagamentoDinheiroDebito(cbxTipoPagamento.selectedItem.descTipoPagamento)) {
				msg += "Quantidade de Parcelas";
				validacaoOk = false;
			}
			
			msg += " é de preenchimento obrigatório.";
			
			if (!validacaoOk) {
				Alert.show(msg, "Erro!");
			}
			
			return validacaoOk;
		}
		
		private function fechar(event: Event): void {
			PopUpManager.removePopUp(this);
		}
		
		public function limparDados(event: Event = null): void {
			txtCodProduto.text = "";
			
			_listaProdutos = new ArrayCollection();
			grdProdutos.dataProvider = _listaProdutos;
			
			cbxTipoPagamento.selectedIndex = 0;
			cbxQtdParcelas.selectedIndex = 0;
			txtDesconto.text = "";
			lblValorTotal.text = "R$ 0,00";
			
			lblDesconto.visible = false;
			lblValorDesconto.visible = false;
			
			pesquisaPessoas.limparCliente();
		}
		
		private function limparCamposListaComprasVazia(): void {
			
			cbxTipoPagamento.selectedIndex = 0;
			cbxQtdParcelas.selectedIndex = 0;
			txtDesconto.text = "";
			lblValorTotal.text = "R$ 0,00";
			
			lblDesconto.visible = false;
			lblValorDesconto.visible = false;
		}
		
		public function set telaAplicacao(tela: Aplicacao): void {
			_telaAplicacao = tela;
		}
		
		public function removerListaNomesPesquisas(event: MouseEvent): void {
			if (pesquisaPessoas.cnvNomesPessoas != null) {
				pesquisaPessoas.limparNomesPessoas();
			}
		}
		
		private function enterPressionadoCodProduto(event: KeyboardEvent): void {
			
			/* Verifica se a tecla acionada é a 13 (enter) 
			 * e chama o metodo adicionar produto.
			 */ 
			if (event.keyCode == 13) {
				adicionarProduto();
			}
		}
		
		private function enterPressionadoDesconto(event: KeyboardEvent): void {
			
			/* Verifica se a tecla acionada é a 13 (enter) 
			 * e chama o metodo calcularValorTotalCompra.
			 */ 
			if (event.keyCode == 13) {
				calcularValorTotalCompra();
			}
		}
		
		public function get listaProdutos(): ArrayCollection {
			return _listaProdutos;
		}
		
		public function produtoExistenteListaVendas(idProduto: String): Boolean {
			var existeProdutoLista: Boolean = false;
			
			for each (var vendaVO: VendaVO in listaProdutos) {
				if (vendaVO.idProduto == idProduto) {
					existeProdutoLista = true;
				}
			}
			
			return existeProdutoLista;
		}
		
		private function tipoPagamentoSelecionado(event: ListEvent): void {
			if (tipoPagamentoDinheiroDebito(cbxTipoPagamento.selectedItem.descTipoPagamento)) {
				cbxQtdParcelas.enabled = false;
			} else {
				cbxQtdParcelas.enabled = true;
			}
		}
		
		private function tipoPagamentoDinheiroDebito(descTipoPagamento: String): Boolean {
			
		var vendaDinheiroDebito: Boolean = false;
			
			if (descTipoPagamento == TIPO_VENDA_DINHEIRO || descTipoPagamento == TIPO_VENDA_CARTAO_DEBITO_AMERICAN_EXPRESS
				|| descTipoPagamento == TIPO_VENDA_CARTAO_DEBITO_HIPERCARD || descTipoPagamento == TIPO_VENDA_CARTAO_DEBITO_MASTERCARD
				|| descTipoPagamento == TIPO_VENDA_CARTAO_DEBITO_VISA) {
				
				vendaDinheiroDebito = true;
			}
			
			return vendaDinheiroDebito;
		}
	}
}